
package tema6;

import java.io.IOException;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.ServletContext;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebServlet(name="ModificarAtributosServlet", urlPatterns={"/tema6/modificarAtributos"})
public class ModificarAtributosServlet extends HttpServlet {
    
    protected void procesaPeticion(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        HttpSession sesion = request.getSession();
        HashMap<String,String> atributosSesion = getAtributosSesion(sesion);
        Set<String> atributosSesionSeleccionados = atributosFormularioSeleccionados("sesion",request);
        Set<String> atributosSesionNoSeleccionados = atributosFormularioNoSeleccionados(atributosSesion,atributosSesionSeleccionados);
        eliminarAtributosSesion(atributosSesionNoSeleccionados,sesion);
        
        ServletContext contexto = request.getServletContext();
        HashMap<String,String> atributosContexto = getAtributosContexto(contexto);
        Set<String> atributosContextoSeleccionados = atributosFormularioSeleccionados("contexto",request);
        Set<String> atributosContextoNoSeleccionados = atributosFormularioNoSeleccionados(atributosContexto,atributosContextoSeleccionados);
        eliminarAtributosContexto(atributosContextoNoSeleccionados,contexto);
        
        Cookie[] cookies = request.getCookies();
        HashMap<String,String> atributosCookies = getAtributosCookies(cookies);
        Set<String> atributosCookiesSeleccionados = atributosFormularioSeleccionados("cookies",request);
        Set<String> atributosCookiesNoSeleccionados = atributosFormularioNoSeleccionados(atributosCookies,atributosCookiesSeleccionados);
        eliminarAtributosCookies(atributosCookiesNoSeleccionados,response);
        
        RequestDispatcher muestraAtributosServlet = contexto.getNamedDispatcher("GenerarFormularioAtributosServlet");
        muestraAtributosServlet.forward(request,response);
    }   
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        procesaPeticion(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        procesaPeticion(request, response);
    }
       
    private HashMap<String, String> getAtributosSesion(HttpSession sesion) {
        HashMap<String,String> atributos = new HashMap();
        Enumeration<String> cabecerasAtributos = sesion.getAttributeNames();
        while(cabecerasAtributos.hasMoreElements()){
            String atributo = cabecerasAtributos.nextElement();
            atributos.put(atributo, (String) sesion.getAttribute(atributo));
        }
        
        return atributos;
    }

    private HashMap<String, String> getAtributosContexto(ServletContext contexto) {
        HashMap<String,String> atributos = new HashMap();
        Enumeration<String> cabecerasAtributos = contexto.getAttributeNames();
        while(cabecerasAtributos.hasMoreElements()){
            String atributo = cabecerasAtributos.nextElement();
            atributos.put(atributo, contexto.getAttribute(atributo).toString());            
        }
        
        return atributos;
    }

    private HashMap<String, String> getAtributosCookies(Cookie[] cookies) {
        HashMap<String,String> atributos = new HashMap();
        for(int i=0;cookies!=null&&cookies.length>i;i++){
            atributos.put(cookies[i].getName(), cookies[i].getValue());
        }
        
        return atributos;
    }

    private Set<String> atributosFormularioNoSeleccionados(HashMap<String, String> atributosExistentes, Set<String> atributosFormulario) {
        Set<String> atributosNoSeleccionados = atributosExistentes.keySet();      
        if(!atributosFormulario.isEmpty()){
            atributosNoSeleccionados = atributosExistentes.keySet();
            for(String atributoSeleccionado : atributosFormulario){
                if(atributosNoSeleccionados.contains(atributoSeleccionado))
                    atributosNoSeleccionados.remove(atributoSeleccionado);
            }            
        } 
        
        return atributosNoSeleccionados;
    }

    private Set<String> atributosFormularioSeleccionados(String categoria, HttpServletRequest request) {
        Set<String> atributosFormulario = new HashSet();
        String[] atributos = request.getParameterValues(categoria);
        if(atributos != null)
            atributosFormulario.addAll(Arrays.asList(atributos));
        
        return atributosFormulario;
    }

    private void eliminarAtributosSesion(Set<String> atributosNoSeleccionados, HttpSession sesion) {
        for (String atributo : atributosNoSeleccionados)
            sesion.removeAttribute(atributo);
    }

    private void eliminarAtributosContexto(Set<String> atributosNoSeleccionados, ServletContext contexto) {
        for (String atributo : atributosNoSeleccionados)
            contexto.removeAttribute(atributo);
    }

    private void eliminarAtributosCookies(Set<String> atributosNoSeleccionados, HttpServletResponse response) {
        for (String atributo : atributosNoSeleccionados){
            Cookie cookie = new Cookie(atributo,"");
            cookie.setMaxAge(0);
            response.addCookie(cookie);
        }
    }

}
